//: [Previous](@previous)

/*:
 ### Evaluate Reverse Polish Notation
 LeetCode上第150号问题：逆波兰表达式求值
 ```
 根据逆波兰表示法，求表达式的值。
 
 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。
 
 说明：
 
 整数除法只保留整数部分。
 给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。
 
 示例 1：
 
 输入: ["2", "1", "+", "3", "*"]
 输出: 9
 解释: ((2 + 1) * 3) = 9
 
 示例 2：
 输入: [“4”, “13”, “5”, “/“, “+”]
 输出: 6
 解释: (4 + (13 / 5)) = 6
 
 示例 3：
 
 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
 输出: 22
 解释:
 ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
 = ((10 * (6 / (12 * -11))) + 17) + 5
 = ((10 * (6 / -132)) + 17) + 5
 = ((10 * 0) + 17) + 5
 = (0 + 17) + 5
 = 17 + 5
 = 22
 ```
*/

func Solution(_ tokens: [String]) -> Int {
    
    var stack: [Int] = []
    
    for c in tokens {
        print(c)
        print(stack)
        if c == "+" {
            let a = stack.popLast()!
            let b = stack.popLast()!
            print("\(b) + \(a)")
            stack.append(b + a)
        } else if c == "-"  {
            let a = stack.popLast()!
            let b = stack.popLast()!
            print("\(b) - \(a)")
            stack.append(b - a)
        } else if c == "*" {
            let a = stack.popLast()!
            let b = stack.popLast()!
            print("\(b) * \(a)")
            stack.append(b * a)
        } else if c == "/" {
            let a = stack.popLast()!
            let b = stack.popLast()!
            stack.append(b / a)
        } else {
            stack.append(Int(c)!)
        }
    }
    
    return stack.popLast() ?? 0
}

//print(Solution(["2", "1", "+", "3", "*"]))
print(Solution(["4", "13", "5", "/", "+"]))

//: [Next](@next)
